====== Smart cards sous Linux ======

===== Présentation =====

Les Smart cards (carte à puce, carte sans contact...) sont des cartes intelligentes qui embarque un microcontrôleur ou un microprocesseur. Le nombre d'application est illimité.

Les exemples les plus populaire de smartcard sont les cartes de paiement, les cartes vitales, les cartes de transport ou encore les cartes de fidélité distribué en grande surface.

===== Interface de communication =====

L'utilisation d'une Smart Card requiert l'installation sur la machine d'un lecteur de carte et une interface de communication.

==== PC/SC (Personal computer/Smart Card) ====

Personal computer/Smart Card (ou PC/SC) est une bibliothèque logicielle pour l'accès à des cartes à puce sous Microsoft Windows. Une implémentation libre de PC/SC, appelée PC/SC Lite, est disponible sous GNU/Linux et distribuée avec Mac OS X.
La spécification de cette bibliothèque est faite par le PC/SC Workgroup, composé de grands fabricants de carte à puce ou d'ordinateur. Son but est d'assurer une base standard de commandes pour permettre une meilleure interopérabilité entre PC, lecteurs de carte et les cartes à puce elles-mêmes. (Wikipédia)

=== Installation ===

La gestion des lecteurs PC/SC n'est pas natif sous Linux, mais peut être très facilement ajouté par l'installation des paquets **[[apt>pcscd,libpcsclite1]]** qui installe respectivement le démon PC/SC et la bibliothèque de communication :

<code>
sudo apt-get install pcscd libpcsclite1
</code>

Par la suite suivant votre lecteur, il vous faudra installer le driver PC/SC adéquate. Un certain nombre est déjà fourni dans les dépôts Ubuntu. A vous d'installer celui correspondant à votre périphérique.

<code>
$> apt-cache search "PC/SC driver"
libacr38u - PC/SC driver for the ACR38U smart card reader
libasedrive-serial - PC/SC driver for the Athena ASEDrive IIIe serial smart card reader
libasedrive-usb - PC/SC driver for the Athena ASEDrive IIIe USB smart card reader
libccid - PC/SC driver for USB CCID smart card readers
libgcr410 - PC/SC driver for GemPlus GCR410 serial SmartCard interface
libgempc410 - PC/SC driver for the GemPC 410, 412, 413 and 415 smart card readers
libgempc430 - PC/SC driver for the GemPC 430, 432, 435 smart card readers
pcsc-omnikey - PC/SC driver for Omnikey Cardman Smartcard readers (binary-only)
</code>

Le paquet **libccid** installé par défaut avec **pcscd** est le driver PC/SC pour le standard CCID. Il permet la reconnaissance d'un grand nombre de lecteurs génériques basés sur ce standard.

=== Test ===

Pour vérifier que tout fonctionne, vous pouvez utiliser l'outil **pcsc_scan** du paquet **[[apt>pcsc-tools]]**.

<code>
sudo apt-get install pcsc-tools
pcsc_scan
</code>

Celui vous listera les lecteurs reconnu et les cartes détectés sur ceux-ci avec quelques informations supplémentaires.
==== javax.smartcardio ====

L'API Java Smart Card I/O défini par la JSR 268 est une API pour le langage Java permettant la communication avec les Smart Cards en utilisant l'ISO/IEC 7816-4 APDUs. Elle permet ainsi la lecture et l'écriture des cartes et fonctionne avec le lecteur PC/SC.

Un des ses atouts majeur et que couplé à une applet Java, elle permet l'utilisation directement des cartes depuis le navigateur Web.

Cette API a été introduit depuis Java 1.6 et est disponible et fonctionnelle avec les [[java#implementations|implémentations Java de sun et openJDK]].

=== Exemple d'utilisation ===



=== Utilisation avec Eclipse ===

Généralement, sous Eclipse vous obtiendrez un message d'erreur du type sur les classes de l'API : 
<note important>Access restriction: The type TerminalFactory is not accessible due to restriction on required library /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar</note>

Pour pallier à ce problème, il faut lever les restrictions d'Eclipse sur la JVM.
  * Clic droit sur votre projet puis **Properties**
  * Dans la section **Java Build Path**, onglet **Librairies**, choisissez la ligne **Access rules** puis bouton **Edit**.
  * Dans la fenêtre, ajouter une règle avec le bouton **Add**.
  * Dans **Resolution**, choisir "//Accessible//" et dans **Rule pattern** mettre //"%%javax/smartcardio/**%%"//.
  * Enfin valider.
Désormais, vos classes sont accessible.

=== Problème de détection des cibles ===

Si votre cible est correctement détecter avec pcsc_scan mais pas avec Java, ceci est du à un [[https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/378294|bug]] dans Ubuntu (ou Java au choix). 

Par défaut, l'API Java cherche **libpcsclite.so** dans les dossiers ///usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64//. Cependant, sous Ubuntu, elle se situe dans le dossier ///lib//.

Pour y remédier, plusieurs solutions :

== Copier la bibliothèque au bon endroit : ==

Sous architecture x86 :
<code>
sudo ln -s /lib/libpcsclite.so.1 /usr/local/lib/libpcsclite.so
</code>

Sous architecture amd64 :
<code>
sudo ln -s /lib/libpcsclite.so.1 /usr/local/lib64/libpcsclite.so
</code>

== Définir la librairie à l'exécution du programme : ==

<code>
java -Dsun.security.smartcardio.library=/usr/local/lib/libpcsclite.so TestSmartCardIO 
</code>

== Faire le travail dans le code : ==

Rechercher le fichier dans /lib dans le code :

<code>
File libPcscLite = new File("/lib/libpcsclite.so.1");
if (libPcscLite.exists()) {
  System.setProperty("sun.security.smartcardio.library", libPcscLite.getAbsolutePath());
}
</code>
===== Outils =====



===== Liens externes =====

[[http://www.unixgarden.com/index.php/securite/gestion-des-smartcards-sous-linux|Article de Linux Magazine sur les Smart Cards]]
[[http://www.springcard.com/solutions/pcsc.html|Liste d'outils PCSC recensé par SpringCard]]